package com.itheima.tliasmanager.aop;

import com.itheima.tliasmanager.mapper.OperateLogMapper;
import com.itheima.tliasmanager.pojo.domain.OperateLog;
import com.itheima.tliasmanager.utils.ApplicationContext;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Arrays;

/**
 * 记录所有更新操作的日志切面类
 */
@Slf4j
@Component
//@Aspect
public class OperateLogAspect {

    @Autowired
    private OperateLogMapper operateLogMapper;

   // @Autowired
   // private HttpServletRequest request;


    //通知类型：环绕通知@Around()
    //切入点表达式：@annotation  +  @Log
    @Around("@annotation(com.itheima.tliasmanager.annotation.Log)")
    public  Object  recordOperateLog(ProceedingJoinPoint pjp) throws Throwable {  //连接点/，目标方法对象 （封装了目标方法的所有信息）
        log.info("操作日志切面类，当前线程名称：{}",Thread.currentThread().getName());


        //记录操作日志：本质就是向日志表插入一条日志数据
        //1.创建日志对象，封装日志数据
        OperateLog log = new OperateLog();

        //设置操作时间
        log.setOperateTime(LocalDateTime.now());

        //设置目标方法相关的信息
        log.setClassName(pjp.getTarget().getClass().getName());  //设置目标方法所属的类信息
        log.setMethodName(pjp.getSignature().getName());  //设置目标方法名称
        log.setMethodParams(Arrays.toString(pjp.getArgs())); //设置目标方法参数

        //执行目标方法
        long start = System.currentTimeMillis();
        Object result = pjp.proceed();
        long end = System.currentTimeMillis();

        //设置目标方法的执行结果和耗时
        log.setCostTime(end-start); //设置目标方法的耗时
        log.setReturnValue(result+""); //设置目标方法返回值

        //设置操作者信息：自行解析请求数据对象中的令牌中的员工id
        log.setOperateEmpId(ApplicationContext.getEmpId()); //设置当前操作人员的id

        //2.添加日志数据到日志表
        operateLogMapper.insert(log);


        return result;
    }
}
